home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1993 / MacHack 1993.toast / MacHack™ 1987-1992 / MacHack™ '90 / Source Code ƒ / MPW C ƒ / ShoveIt / ShoveIt.a < prev    next >
Encoding:
Text File  |  1989-02-09  |  13.9 KB  |  632 lines  |  [TEXT/MPS ]

  1. ;; Copyright 1988, Gail Zacharias.  All rights reserved.
  2. ;; Permission is hereby granted to copy, reproduce, redistribute or
  3. ;; otherwise use this software provided there is no monetary profit
  4. ;; gained specifically from its use or reproduction, it is not sold,
  5. ;; rented, traded or otherwise marketed, and this copyright notice 
  6. ;; and the software version number is included prominently in any copy
  7. ;; made.
  8. ;; This is ShoveIt version 1.0.
  9. ;;
  10. ;; Send comments, suggestions, bug reports (not bloody likely), feature
  11. ;; requests, etc. to gz@entity.com.
  12. ;;
  13.  
  14. ;; Edit history:
  15. ;; 6/3/88 gz    1.0 released
  16.  
  17.     include 'sysequ.a'
  18.     include 'toolequ.a'
  19.     include 'packmacs.a'
  20.     include 'syserr.a'
  21.     include 'traps.a'
  22.     load 'FlowCtlMacs.d'
  23.     case object
  24.     string pascal
  25.  
  26.     import (_RTInit, exit, write):code        ;runtime.o
  27.     import (compinit, compwrite, compclose):code    ;compstream.a.o
  28.  
  29.  
  30. sVers    equ    01
  31.  
  32. readbufsize    equ    512        ;(Must be at least 256...)
  33.  
  34. shdrrec    record 0
  35. sit    ds.l    1            ;'SIT!'
  36. fcount    ds.w    1            ;number of files
  37. length    ds.l    1            ;length of archive
  38. sig2    ds.l    1            ;meglomania
  39. vers    ds.b    1            ;version
  40.     ds.b    7            ;unused
  41. size    equ    *-shdrrec
  42.     endr
  43.  
  44. fhdrrec    record 0
  45. rcomp    ds.b    1            ;rsrc fork compression method
  46. dcomp    ds.b    1            ;data for compression method
  47. fname    ds.b    64            ;file name, pstr.
  48. ftype    ds.l    1            ;file type
  49. fcreat    ds.l    1            ;file creator
  50. fflags    ds.w    1            ;finder flags
  51. cdate    ds.l    1            ;creation date
  52. mdate    ds.l    1            ;modification date
  53. rlglen    ds.l    1            ;rsrc fork length
  54. dlglen    ds.l    1            ;data fork length
  55. rlen    ds.l    1            ;rsrc compressed length
  56. dlen    ds.l    1            ;data compressed length
  57. rcrc    ds.w    1            ;rsrc fork crc
  58. dcrc    ds.w    1            ;data fork crc
  59.     ds.b    6            ;unused
  60. hcrc    ds.w    1            ;header crc
  61. size    equ    *-fhdrrec
  62.     endr
  63.  
  64. ; A6 variables
  65. globals    record -4,decr
  66. docomp        ds.w 1    ;This was gonna be a user option but I can't get Stuffit
  67.             ;to extract uncompressed entries!!!
  68. fname        ds.l 1
  69. sitname        ds.l 1
  70. sitvrefnum    ds.w 1
  71. pgmname        ds.l 1
  72. shdr        ds.b shdrrec
  73. fhdr        ds.b fhdrrec
  74. ipb        ds.b ioHVQElSize
  75. opb        ds.b ioHVQElSize
  76. readbuf        ds.b readbufsize
  77. fprecsz    equ    *
  78.     endr
  79.  
  80. ShoveIt    main
  81.     subq #8,sp
  82.     pea 1            ;forPascal = true
  83.     pea 0            ;pEnvP
  84.     pea 12(sp)        ;pArgV
  85.     pea 12(sp)        ;pArgC
  86.     pea @exit        ;retPC
  87.     jsr _RTInit
  88.     lea 20(sp),sp
  89.     move.l (sp)+,d0
  90.     move.l (sp)+,a0
  91.     bsr.s shovethem
  92.     move.l d0,-(sp)
  93.     jsr exit
  94.     addq #4,sp
  95. @exit    rts
  96.  
  97.     with globals
  98.  
  99. shovethem
  100. argv    set a3
  101. argc    set d3
  102.     movem.l d2-d7/a2-a4,-(sp)
  103.     link a6,#fprecsz
  104.     move.l a0,argv
  105.     move.l d0,argc
  106.     clr.w ipb+ioRefnum(a6)
  107.     clr.w opb+ioRefnum(a6)
  108.     move.w #1,docomp(a6)
  109.     move.l (argv)+,pgmname(a6)
  110.     subq.l #2,argc
  111.     ble.s @usage
  112.     move.l (argv)+,a0        ;Output filename
  113.     moveq #0,d0
  114.     bsr openoutput
  115.     lea shdr(a6),a0
  116.     moveq #shdrrec.size,d0
  117.     bsr clearbuf
  118.     lea shdr(a6),a1
  119.     moveq #shdrrec.size,d1
  120.     add.l d1,shdr.length(a6)
  121.     bsr shovebuf
  122.     repeat#
  123.       move.l (argv)+,a0
  124.       moveq #0,d0
  125.       bsr shovefile
  126.       addq.w #1,shdr.fcount(a6)
  127.       subq.l #1,argc
  128.     until#.s eq
  129.     move.l #'SIT!',shdr.sit(a6)
  130.     move.l #'rLau',shdr.sig2(a6)
  131.     move.b #sVers,shdr.vers(a6)
  132.     lea shdr(a6),a1
  133.     moveq #shdrrec.size,d1
  134.     moveq #0,d0
  135.     bsr stuffit
  136.     bsr closeoutput
  137.     moveq #0,d0
  138.     bra.s return
  139.  
  140. @usage    lea #'Usage: ',a0
  141.     bsr errout
  142.     move.l pgmname(a6),a0
  143.     bsr errout
  144.     lea #' output-file input-files...',a0
  145.     bsr errout
  146.     lea cr(pc),a0
  147.     bsr errout
  148.     moveq #2,d0
  149. return:    move.l d0,-(sp)
  150.     tst.w ipb+ioRefNum(a6)
  151.     if# ne then.s
  152.       lea ipb(a6),a0
  153.       _Close
  154.     endif#
  155.     tst.w opb+ioRefNum(a6)
  156.     if# ne then.s
  157.       lea opb(a6),a0
  158.       _Close
  159.       move.l sitname(a6),opb+ioFileName(a6)
  160.       move.w sitvrefnum(a6),opb+ioVRefNum(a6)
  161.       sf opb+ioFileType(a6)
  162.       lea opb(a6),a0
  163.       _Delete
  164.     endif#
  165.     move.l (sp)+,d0
  166.     unlk a6
  167.     movem.l (sp)+,d2-d7/a2-a4
  168.     rts
  169.  
  170.  
  171. ;A0=filename, D0=vrefnum.
  172. shovefile:
  173. vrefnum    set  d7
  174. startp    set  d6
  175.     movem.l vrefnum/startp,-(sp)
  176.     move.l shdr.length(a6),startp
  177.     move.w d0,vrefnum
  178.     move.l a0,fname(a6)
  179.     move.l a0,a1
  180.     move.w d0,d1
  181.     lea ipb(a6),a0
  182.     bsr GetFileInfo
  183.     bne read_err
  184.     lea fhdr(a6),a0
  185.     moveq #fhdrrec.size,d0
  186.     bsr clearbuf
  187.     move.w #$0202,fhdr.rcomp(a6)
  188.     move.l ipb+ioFlUsrWds+fdType(a6),fhdr.ftype(a6)
  189.     move.l ipb+ioFlUsrWds+fdCreator(a6),fhdr.fcreat(a6)
  190.     move.w ipb+ioFlUsrWds+fdFlags(a6),fhdr.fflags(a6)
  191.     move.l ipb+ioFlCrDat(a6),fhdr.cdate(a6)
  192.     move.l ipb+ioFlMdDat(a6),fhdr.mdate(a6)
  193.     move.l ipb+ioFlLgLen(a6),fhdr.dlglen(a6)
  194.     move.l ipb+ioFlRLgLen(a6),fhdr.rlglen(a6)
  195.     move.l fname(a6),a0
  196.     moveq #0,d1
  197.     move.b (a0)+,d1
  198.     add.w d1,a0
  199.     moveq #0,d0
  200.     subq #1,d1
  201. @loop    addq #1,d0
  202.     cmp.b #':',-(a0)
  203.     dbeq d1,@loop
  204.     if# eq then.s
  205.       addq #1,a0
  206.       subq #1,d0
  207.     endif#
  208.     lea fhdr.fname(a6),a1
  209.     move.b d0,(a1)+
  210.     _BlockMove
  211.  
  212.     lea fhdr(a6),a1
  213.     moveq #fhdrrec.size,d1
  214.     add.l d1,shdr.length(a6)
  215.     bsr shovebuf
  216.     move.l fname(a6),ipb+ioFileName(a6)
  217.     move.w vrefnum,ipb+ioVRefNum(a6)
  218.     sf ipb+ioFileType(a6)
  219.     move.b #fsRdPerm,ipb+ioPermssn(a6)
  220.     clr.l ipb+ioOwnBuf(a6)
  221.     lea ipb(a6),a0
  222.     _OpenRF
  223.     bne read_err
  224.     move.l fhdr.rlglen(a6),d0
  225.     bsr shovefork
  226.     if# eq then.s
  227.       sf fhdr.rcomp(a6)
  228.     endif#
  229.     move.l d0,fhdr.rlen(a6)
  230.     move.w d1,fhdr.rcrc(a6)
  231.     lea ipb(a6),a0
  232.     _Close
  233.     clr.w ioRefNum(a0)
  234.     move.l fname(a6),ipb+ioFileName(a6)
  235.     move.w vrefnum,ipb+ioVRefNum(a6)
  236.     sf ipb+ioFileType(a6)
  237.     move.b #fsRdPerm,ipb+ioPermssn(a6)
  238.     clr.l ipb+ioOwnBuf(a6)
  239.     lea ipb(a6),a0
  240.     _Open
  241.     bne read_err
  242.     move.l fhdr.dlglen(a6),d0
  243.     bsr.s shovefork
  244.     if# eq then.s
  245.       sf fhdr.dcomp(a6)
  246.     endif#
  247.     move.l d0,fhdr.dlen(a6)
  248.     move.w d1,fhdr.dcrc(a6)
  249.     lea ipb(a6),a0
  250.     _Close
  251.     clr.w ioRefNum(a0)
  252.     lea fhdr(a6),a0
  253.     moveq #fhdrrec.size-2-1,d0
  254.     moveq #0,d2
  255. @crc:    move.b (a0)+,d1
  256.     eor.b d1,d2
  257.     move.w d2,d1
  258.     add.w d1,d1
  259.     lea crctab(pc),a1
  260.     add.w d1,a1            ;two memory accesses, but it's still
  261.     move.b (a1)+,d2            ;faster than a lsr.w #8!  (Might want
  262.         swap d2                ;to use a different strategy on a '20)
  263.         move.b (a1),d1
  264.         eor.b d1,d2
  265.         dbf d0,@crc
  266.     move.b d2,fhdr.hcrc+1(a6)
  267.     swap d2
  268.     move.b d2,fhdr.hcrc(a6)
  269.     lea fhdr(a6),a1
  270.     moveq #fhdrrec.size,d1
  271.     move.l startp,d0
  272.     bsr stuffit
  273.     movem.l (sp)+,vrefnum/startp
  274.     rts
  275.  
  276. ;shove d0 bytes from ipb to opb, updating shdr.length
  277. ;returns number of bytes written in d0 and crc in d1.
  278. ;Z flag is set if not compressed.
  279. shovefork:
  280. crc    set d6
  281. loglen    set d5
  282. count    set d4
  283. cstream    set d3
  284. ctab    set a4
  285. ptr    set a3
  286.     movem.l loglen/count/crc/cstream/ctab/ptr,-(sp)
  287.     moveq #0,crc
  288.     lea crctab(pc),ctab
  289.     move.l d0,loglen
  290.     beq @ret
  291.     tst.w docomp(a6)
  292.     beq @plain
  293.     pea opb(a6)            ;param
  294.     pea @output(pc)            ;outputfn
  295.     pea 1                ;block_compress
  296.     pea 14                ;maxbits
  297.     jsr compinit
  298.     lea 16(sp),sp
  299.     move.l d0,cstream
  300.     if# eq then.s
  301.       lea #'Out of memory',a0
  302.       bra fatal
  303.     endif#
  304.     move.l loglen,count
  305.     lea readbuf(a6),a0
  306.     move.l a0,ipb+ioBuffer(a6)
  307.     move.l #readbufsize,ipb+ioByteCount(a6)
  308.     move.w #fsAtMark,ipb+ioPosMode(a6)
  309.     repeat#
  310.       if# count cs.l ipb+ioByteCount(a6) then.s
  311.         move.l count,ipb+ioByteCount(a6)
  312.       endif#
  313.       lea ipb(a6),a0
  314.       _Read
  315.       bne read_err
  316.       move.l ipb+ioBuffer(a6),a1
  317.       move.l ipb+ioNumDone(a6),d1
  318.       beq read_err
  319.       move.l a1,-(sp)
  320.       move.l d1,-(sp)
  321.       subq.w #1,d1
  322. @crc:      move.b (a1)+,d0
  323.       eor.b d0,crc
  324.       move.w crc,d0
  325.       add.w d0,d0
  326.       lea 0(ctab,d0.w),a0        ;two memory accesses, but it's still
  327.       move.b (a0)+,crc        ;faster than a lsr.w #8!  (Might want
  328.           swap crc            ;to use a different strategy on a '20)
  329.           move.b (a0),d0
  330.           eor.b d0,crc
  331.           dbf d1,@crc
  332.       move.l cstream,-(sp)
  333.       jsr compwrite
  334.       tst.w d0
  335.       bmi write_err
  336.       lea 12(sp),sp
  337.       sub.l ipb+ioNumDone(a6),count
  338.     until#.s eq
  339.     move.l cstream,-(sp)
  340.     jsr compclose
  341.     addq #4,sp
  342.     tst.w d0
  343.     bmi write_err
  344.     lea opb(a6),a0
  345.     _GetFPos
  346.     bne write_err
  347.     move.l opb+ioPosOffset(a6),d0
  348.     sub.l shdr.length(a6),d0
  349.     cmp.l loglen,d0
  350.     bcs @ret
  351.     ;no pain, no gain.
  352.     bsr setoutpos
  353.     move.w #fsFromStart,ipb+ioPosMode(a6)
  354.     clr.l ipb+ioPosOffset(a6)
  355.     lea ipb(a6),a0
  356.     _SetFPos
  357.     bne read_err
  358. @plain    move.l loglen,count
  359.     lea readbuf(a6),a0
  360.     move.l a0,ipb+ioBuffer(a6)
  361.     move.l #readbufsize,ipb+ioByteCount(a6)
  362.     move.w #fsAtMark,ipb+ioPosMode(a6)
  363.     repeat#
  364.       if# count cs.l ipb+ioByteCount(a6) then.s
  365.         move.l count,ipb+ioByteCount(a6)
  366.       endif#
  367.       lea ipb(a6),a0
  368.       _Read
  369.       bne read_err
  370.       move.l ipb+ioBuffer(a6),a1
  371.       move.l ipb+ioNumDone(a6),d1
  372.       beq read_err
  373.       tst.w docomp(a6)
  374.       if# eq then.s
  375.         move.l a1,ptr
  376.         move.l d1,d2
  377.         subq.w #1,d2
  378. @pcrc:        move.b (ptr)+,d0
  379.         eor.b d0,crc
  380.         move.w crc,d0
  381.         add.w d0,d0
  382.         lea 0(ctab,d0.w),a0        ;two memory accesses, but it's still
  383.         move.b (a0)+,crc        ;faster than a lsr.w #8!  (Might want
  384.             swap crc            ;to use a different strategy on a '20)
  385.             move.b (a0),d0
  386.             eor.b d0,crc
  387.             dbf d2,@pcrc
  388.       endif#
  389.       bsr shovebuf
  390.       sub.l ipb+ioNumDone(a6),count
  391.     until#.s eq
  392.     tst.w docomp(a6)
  393.     if# ne then.s
  394.       move.l shdr.length(a6),opb+ioLEOF(a6)
  395.       add.l loglen,opb+ioLEOF(a6)
  396.       lea opb(a6),a0
  397.       _SetEof
  398.       bne write_err
  399.     endif#
  400.     move.l loglen,d0
  401. @ret    add.l d0,shdr.length(a6)
  402.     move.w crc,d1
  403.     lsr.l #8,crc
  404.     or.w crc,d1
  405.     cmp.l loglen,d0            ;set compressed flag.
  406.     movem.l (sp)+,loglen/count/crc/cstream/ctab/ptr
  407.     rts
  408.  
  409. @output
  410.     move.l 4(sp),a0
  411.     move.l 8(sp),ioByteCount(a0)
  412.     move.l 12(sp),ioBuffer(a0)
  413.     move.w #fsAtMark,ioPosMode(a0)
  414.     _Write
  415.     if# eq then.s
  416.       move.l ioNumDone(a0),d0
  417.       cmp.l ioByteCount(a0),d0
  418.       beq.s @rts
  419.     endif#
  420.     tst.w d0
  421.     if# pl then.s
  422.       moveq #writErr,d0
  423.     endif#
  424.     ext.l d0
  425. @rts    rts
  426.  
  427. stuffit
  428.     move.l d0,opb+ioPosOffset(a6)
  429.     move.w #fsFromStart,opb+ioPosMode(a6)
  430.     bsr.s writeit
  431. setoutpos:
  432.     move.w #fsFromStart,opb+ioPosMode(a6)
  433.     move.l shdr.length(a6),opb+ioPosOffset(a6)
  434.     lea opb(a6),a0
  435.     _SetFPos
  436.     bne.s write_err
  437.     rts
  438.  
  439. shovebuf
  440.     move.w #fsAtMark,opb+ioPosMode(a6)
  441. writeit    lea opb(a6),a0
  442.     move.l a1,ioBuffer(a0)
  443.     move.l d1,ioByteCount(a0)
  444.     _Write
  445.     bne.s write_err
  446.     rts
  447.  
  448.  
  449. read_err:
  450.     move.w d0,d2            ;save error code
  451.     if# eq then.s
  452.       moveq #readErr,d2
  453.     endif#
  454.     lea #'Can''t read "',a0
  455.     move.l fname(a6),a1
  456.     bra.s xioerror
  457.  
  458. write_err:
  459.     move.w d0,d2
  460.     if# eq then.s
  461.       moveq #writErr,d2
  462.     endif#
  463.     lea #'Can''t write "',a0
  464.     move.l sitname(a6),a1
  465. xioerror
  466.     move.l a1,-(sp)
  467.     lea readbuf(a6),a2
  468.     sf (a2)
  469.     bsr append
  470.     move.l (sp)+,a0
  471.     bsr append
  472.     ;Check for some errors which might be meaningful to the user...
  473.     if# d2 eq #bdNamErr then.s
  474.       lea #'" - Bad file name',a0
  475.     elseif#.s d2 eq #fnfErr then.s
  476.       lea #'" - File not found',a0
  477.     elseif#.s d2 eq #nsvErr then.s
  478.       lea #'" - No such volume',a0
  479.     elseif#.s d2 eq #dirNFErr then.s
  480.       lea #'" - No such directory',a0
  481.     elseif#.s d2 eq #tmfoErr then.s
  482.       lea #'" - Too many files open',a0
  483.     elseif#.s d2 eq #dupFNErr then.s
  484.       lea #'" - File already exists',a0
  485.     elseif#.s d2 eq #dirFulErr then.s
  486.       lea #'" - Directory full',a0
  487.     elseif#.s d2 eq #dskFulErr then.s
  488.       lea #'" - Disk full',a0
  489.     elseif#.s d2 eq #fBsyErr then.s
  490.       lea #'" - File is in use',a0
  491.     else#.s
  492.       lea #'" (Error #',a0
  493.       bsr.s append
  494.       subq #8,sp
  495.       move.l sp,a0
  496.       move.b #7,(a0)
  497.       move.w d2,d0
  498.       ext.l d0
  499.       _NumToString
  500.       bsr.s append
  501.       addq #8,sp
  502.       lea #')',a0
  503.     endif#
  504.     bsr.s append
  505.     move.l a2,a0
  506. fatal    move.l a0,-(sp)
  507.     move.l pgmname(a6),a0
  508.     bsr.s errout
  509.     lea #': ',a0
  510.     bsr.s errout
  511.     move.l (sp)+,a0
  512.     bsr.s errout
  513.     lea cr(pc),a0
  514.     bsr.s errout
  515.     moveq #1,d0
  516.     bra return
  517.  
  518. cr    dc.b 1,13
  519.  
  520. errout    moveq #0,d0
  521.     move.b (a0)+,d0
  522.     move.l d0,-(sp)
  523.     move.l a0,-(sp)
  524.     pea 2
  525.     jsr write
  526.     lea 12(sp),sp
  527.     rts
  528.  
  529. ;Only called when we're about to exit, don't bother bounds checking...
  530. append:    move.l a2,a1
  531.     moveq #0,d0
  532.     move.b (a1)+,d0
  533.     add.w d0,a1
  534.     move.b (a0)+,d0
  535.     add.b d0,(a2)
  536.     _BlockMove
  537.     rts
  538.  
  539. ;a0 = filename, d0 = vrefnum
  540. openoutput:
  541.     move.l a0,sitname(a6)
  542.     move.w d0,sitvrefnum(a6)
  543.     move.l a0,opb+ioFileName(a6)
  544.     move.w d0,opb+ioVRefNum(a6)
  545.     sf opb+ioFileType(a6)
  546.     lea opb(a6),a0
  547.     _Create
  548.     bne write_err
  549.     move.b #fsWrPerm,ioPermssn(a0)
  550.     clr.l ioOwnBuf(a0)
  551.     _Open
  552.     bne write_err
  553.     rts
  554.  
  555. closeoutput
  556.     lea opb(a6),a0
  557.     _Close
  558.     clr.w opb+ioRefNum(a6)
  559.     tst.w d0
  560.     bne write_err
  561.     move.l sitname(a6),a1
  562.     move.w sitvrefnum(a6),d1
  563.     lea opb(a6),a0
  564.     bsr.s GetFileInfo
  565.     bne write_err
  566.     move.l sitname(a6),opb+ioFileName(a6)
  567.     move.w sitvrefnum(a6),opb+ioVRefNum(a6)
  568.     move.l #'SIT!',opb+ioFlUsrWds+fdType(a6)
  569.     move.l #'SIT!',opb+ioFlUsrWds+fdCreator(a6)
  570.     lea opb(a6),a0
  571.     _SetFileInfo
  572.     bne write_err
  573.     _FlushVol
  574.     rts
  575.  
  576. ;a0=pb, a1=filename, d1=vrefnum
  577. GetFileInfo:
  578.     lea 256(a1),a1
  579.     moveq #64-1,d0
  580.     move.l -(a1),-(sp)
  581.     dbf d0,*-2
  582.     move.l sp,ioFileName(a0)
  583.     move.w d1,ioVRefNum(a0)
  584.     sf ioFileType(a0)
  585.     clr.w ioFDirIndex(a0)
  586.     _GetFileInfo
  587.     clr.w ioRefNum(a0)
  588.     lea 256(sp),sp
  589.     tst.w d0
  590.     rts
  591.  
  592. clearbuf:
  593.     bra.s @1
  594. @0    sf (a0)+
  595. @1    dbf d0,@0
  596.     rts
  597.  
  598. crctab:
  599.     dc.w $0000, $c0c1, $c181, $0140, $c301, $03c0, $0280, $c241
  600.     dc.w $c601, $06c0, $0780, $c741, $0500, $c5c1, $c481, $0440
  601.     dc.w $cc01, $0cc0, $0d80, $cd41, $0f00, $cfc1, $ce81, $0e40
  602.     dc.w $0a00, $cac1, $cb81, $0b40, $c901, $09c0, $0880, $c841
  603.     dc.w $d801, $18c0, $1980, $d941, $1b00, $dbc1, $da81, $1a40
  604.     dc.w $1e00, $dec1, $df81, $1f40, $dd01, $1dc0, $1c80, $dc41
  605.     dc.w $1400, $d4c1, $d581, $1540, $d701, $17c0, $1680, $d641
  606.     dc.w $d201, $12c0, $1380, $d341, $1100, $d1c1, $d081, $1040
  607.     dc.w $f001, $30c0, $3180, $f141, $3300, $f3c1, $f281, $3240
  608.     dc.w $3600, $f6c1, $f781, $3740, $f501, $35c0, $3480, $f441
  609.     dc.w $3c00, $fcc1, $fd81, $3d40, $ff01, $3fc0, $3e80, $fe41
  610.     dc.w $fa01, $3ac0, $3b80, $fb41, $3900, $f9c1, $f881, $3840
  611.     dc.w $2800, $e8c1, $e981, $2940, $eb01, $2bc0, $2a80, $ea41
  612.     dc.w $ee01, $2ec0, $2f80, $ef41, $2d00, $edc1, $ec81, $2c40
  613.     dc.w $e401, $24c0, $2580, $e541, $2700, $e7c1, $e681, $2640
  614.     dc.w $2200, $e2c1, $e381, $2340, $e101, $21c0, $2080, $e041
  615.     dc.w $a001, $60c0, $6180, $a141, $6300, $a3c1, $a281, $6240
  616.     dc.w $6600, $a6c1, $a781, $6740, $a501, $65c0, $6480, $a441
  617.     dc.w $6c00, $acc1, $ad81, $6d40, $af01, $6fc0, $6e80, $ae41
  618.     dc.w $aa01, $6ac0, $6b80, $ab41, $6900, $a9c1, $a881, $6840
  619.     dc.w $7800, $b8c1, $b981, $7940, $bb01, $7bc0, $7a80, $ba41
  620.     dc.w $be01, $7ec0, $7f80, $bf41, $7d00, $bdc1, $bc81, $7c40
  621.     dc.w $b401, $74c0, $7580, $b541, $7700, $b7c1, $b681, $7640
  622.     dc.w $7200, $b2c1, $b381, $7340, $b101, $71c0, $7080, $b041
  623.     dc.w $5000, $90c1, $9181, $5140, $9301, $53c0, $5280, $9241
  624.     dc.w $9601, $56c0, $5780, $9741, $5500, $95c1, $9481, $5440
  625.     dc.w $9c01, $5cc0, $5d80, $9d41, $5f00, $9fc1, $9e81, $5e40
  626.     dc.w $5a00, $9ac1, $9b81, $5b40, $9901, $59c0, $5880, $9841
  627.     dc.w $8801, $48c0, $4980, $8941, $4b00, $8bc1, $8a81, $4a40
  628.     dc.w $4e00, $8ec1, $8f81, $4f40, $8d01, $4dc0, $4c80, $8c41
  629.     dc.w $4400, $84c1, $8581, $4540, $8701, $47c0, $4680, $8641
  630.     dc.w $8201, $42c0, $4380, $8341, $4100, $81c1, $8081, $4040
  631.     END
  632.